package juc.mythread.communication;


import java.util.concurrent.locks.LockSupport;

class Tests3Park {
    /**
     *
     * LockSupport是Java并发包中的一个工具类，提供了一种低级别的线程同步机制。它主要提供了两个方法：park()和unpark()，用于挂起和恢复线程的执行。
     *
     * park()：挂起当前线程的执行，直到被其他线程通过unpark()唤醒或被中断。
     * unpark(Thread thread)：唤醒指定线程，使其从park()方法返回并继续执行。
     * 
     * LockSupport类的park()和unpark()方法通常用于实现自定义的锁、条件变量等高级同步机制。例如，在实现自旋锁、读写锁等场景中，可以通过park()和unpark()方法来控制线程的执行顺序和资源访问。
     *
     * 这段代码展示了如何在Java中使用LockSupport类的park()和unpark()方法来控制线程执行。具体步骤如下：
     * 创建并启动线程：创建一个名为parkThread的新线程，并传入一个匿名Runnable对象作为参数，然后启动线程。
     * 线程运行逻辑：在parkThread线程中，调用park()方法使当前线程进入挂起状态，等待其他线程调用unpark()唤醒。
     * 主线程操作：在主线程中，调用unpark()方法唤醒parkThread线程，使其从park()方法返回并继续执行。
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        Thread parkThread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("ParkThread开始执行");
                // 当没有"许可"时，当前线程暂停运行；有"许可"时，用掉这个"许可"，当前线程恢复运行
                LockSupport.park();
                System.out.println("ParkThread执行完成");
            }
        });
        parkThread.start();

        Thread.sleep(1000);

        System.out.println("唤醒parkThread");
        // 给线程 parkThread 发送"许可"（多次连续调用 unpark 只会发送一个"许可"）
        LockSupport.unpark(parkThread);
    }
}

